package com.rmb.util;



import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Mr.Fu
 * @date 2021/1/12 19:10
 */
public class FileUtil {

    static String s = Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource("com/rmb/entity/files")).toString();

    static String replace = s.replace("file:/", "");

    /**
     * 删除文件 参数名称：文件名称
     * 功能删除 java文件
     * @param fileName 名称
     * @return 是与否
     */
    public static boolean deleteJava(String fileName) {

        boolean b = deleteFile(replace + "/" + fileName + ".java");
       if (b){
           System.out.println("成功！！！");
           return true;
       }else {
           System.out.println("失败！！！");
           return false;
       }


    }

    /**
     *
     * 删除文件 参数名称：文件名称
     * 功能删除class文件
     * @param fileName
     * @return
     */
    public static boolean deleteclass(String fileName) {

        boolean b = deleteFile(replace + "/" + fileName + ".class");
       if (b){
           System.out.println("成功！！！");
           return true;
       }else {
           System.out.println("失败！！！");
           return false;
       }


    }

    /**
     * 提示是否删除
     * @param fileName
     * @return
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("删除单个文件" + fileName + "成功！");
                return true;
            } else {
                System.out.println("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            System.out.println("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 获取路径
     * @param classFuncName
     * @return
     * @throws IOException
     */
    private static File getFile(String classFuncName) throws IOException {
        File htmlFile = new File(replace + "/" + classFuncName + ".java");

        if(!htmlFile.exists()) {
            try {
                //创建该文件
                htmlFile.createNewFile();

            }catch(IOException e){
                e.printStackTrace();
            }
        }else {
            //删除该文件
            htmlFile.delete();
        }

        //创建缓冲输入流，将文件放到缓冲区里
        return htmlFile;
    }

    private static BufferedWriter getBw(File file) throws IOException {
        return new BufferedWriter(new FileWriter(file));
    }

    /**
     * 创建文件
     * str为文件模板
     * @param classFuncName
     * @return
     * @throws IOException
     */
    public static String createFileUtil(String classFuncName) throws IOException {

        String str= "public class "+classFuncName+" {\n" +
                "\n" +
                "    public static void main(String[] args) {\n" +
                "        \n" +
                "    }\n" +
                "    \n" +
                "}";

        File htmlFile = getFile(classFuncName);

        try (BufferedWriter bw = getBw(htmlFile)) {

            bw.write(str);
            bw.flush();

        } finally { //后置处理代码，无论异常是否被捕获，finally的代码一定会被执行。
            //自定义类加载器并编译java源文件
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            String s1 = htmlFile.toString();
            int result = compiler.run(null, null, null, s1);
            System.out.println(result == 0 ? "编译成功" : "编译失败");
        }
        return str;

    }

    /**
     * 修改 参数为：文件名称，修改后的内容
     * @param classFuncName
     * @param fileContent
     * @return
     * @throws IOException
     */
    public static String updateFileUtil(String classFuncName,String fileContent) throws IOException {

        //创建缓冲输入流，将文件放到缓冲区里
        File htmlFile = getFile(classFuncName);

        try (BufferedWriter bw = getBw(htmlFile)) {
            bw.write(fileContent);
            bw.flush();
        } finally {
            //后置处理代码，无论异常是否被捕获，finally的代码一定会被执行。
            //自定义类加载器并编译java源文件
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            String s1 = htmlFile.toString();
            int result = compiler.run(null, null, null, s1);
            System.out.println(result == 0 ? "编译成功" : "编译失败");
            URL[] urls = new URL[]{new URL("file:/" + replace + "/")};
            URLClassLoader loader = new URLClassLoader(urls);
            try {
                Class c = loader.loadClass(classFuncName);
                Map<String, Object> stringObjectConcurrentHashMap = new ConcurrentHashMap<>(16);
                c.getMethod("execute", Map.class).invoke(c.newInstance(),stringObjectConcurrentHashMap);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return fileContent;

    }



}
